package com.fengshang.wedding.web.module.internal;

import static com.fengshang.wedding.web.module.api.MenuItem.CID;
import static com.fengshang.wedding.web.module.api.MenuItem.ID;
import static com.fengshang.wedding.web.module.api.MenuItem.NAME;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;

import com.fengshang.wedding.web.module.api.IModuleManager;
import com.fengshang.wedding.web.module.api.Menu;
import com.fengshang.wedding.web.module.api.MenuItem;
import com.fengshang.wedding.web.module.api.Module;
import com.fengshang.wedding.web.module.api.Template;
import com.fengshang.wedding.web.module.api.Text;
/**
 * 
 *@author gembin@gmail.com
 * 
 */
@SuppressWarnings( { "unchecked" })
public class ModuleManager implements IModuleManager {
	private static final Logger logger = Logger.getLogger(ModuleManager.class);
	private Map<String, Module> modules;

	/**
	 * load when init
	 */
	public synchronized void load() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("modules.xml");
		try {
			modules = ctx.getBeansOfType(Module.class);
		} catch (BeansException e) {
			e.printStackTrace();
			logger.error("Error when load modules:" + e.getMessage());
		}
	}
	
	public List<String> getModules(){
		List<String>moduleIds=new ArrayList<String>();
		for(Iterator<String>it=modules.keySet().iterator();it.hasNext();){
			 String moduleId=it.next();
			 if(moduleId!=null){
				 logger.debug("moduleId:"+moduleId);
				 moduleIds.add(moduleId);
			 }
		}
		return moduleIds;
	}

	public Map<String, Object> loadModule(String moduleId) {
		Map<String, Object> data = new HashMap<String, Object>();
		logger.debug(modules);
		Module module = modules.get(moduleId);
		logger.debug("load module:"+module);
		if(module==null){
			logger.warn("module with moduleId="+moduleId + " dosen't exists!");
			return null;
		}
		data.put(MODULE_NAME, module.getName());
		data.put(MODULE_TYPE, module.getType());
		data.put(MODULE_MODE, module.getMode());
		data.put(MODULE_JS, module.getJs());
		data.put(MODULE_CSS, module.getCss());
		switch(module.getType()){
		case Module.TYPE_TEXT:
			Text t=Module.castTo(Text.class, module);
			data.put(MODULE_CONTENT, t.getContent());
			break;
		case Module.TYPE_MENU:
			Menu m=Module.castTo(Menu.class, module);
			List items=new ArrayList();
			Iterator<MenuItem> it= m.getItems().iterator();
			Map<String, Object> item =null;
			while(it.hasNext()){
				MenuItem mi=it.next();
				logger.debug("menuItem:"+mi);
				item = new HashMap<String, Object>();
				item.put(ID, mi.getId());
				item.put(CID, mi.getCollectionId());
				item.put(NAME, mi.getName());
				items.add(item);
			}
			logger.debug("menuItems Size:"+items.size());
			data.put(MODULE_CONTENT,items);
			break;
		case Module.TYPE_TEMPLATE:
			Template tp=Module.castTo(Template.class, module);
			data.put(MODULE_CONTENT, tp.getData());
			data.put(MODULE_TEMPLATE, tp.getUri());
			logger.debug("data>>>>"+tp.getData());
			break;
		}
		return data;
	}

	public static void main(String dp[]) throws Exception {
		ModuleManager d = new ModuleManager();
		d.load();
		d.loadModule("loginModule");
		d.getModules();
	}

}
